package T474;

public class Main {

}

class Solution {
    public static void main(String[] args) {
        String[] arr = {
                "10", "0001", "111001", "1", "0"
        };
        System.out.println(findMaxForm(arr, 5, 3));
    }

    static int ones, zeros;

    static void spendOneAndZero(String s) {
        ones = 0;
        zeros = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '0') {
                zeros++;
            } else {
                ones++;
            }
        }
    }

    public static int findMaxForm(String[] strs, int m, int n) {
        int[][][] dp = new int[strs.length][m + 1][n + 1];
        for (int i = 0; i < dp.length; i++) {
            for (int j = 0; j <= m; j++) {
                for (int k = 0; k <= n; k++) {
                    dp[i][j][k] = -1;
                }
            }
        }
        return 1;
    }

    private int f2(String[] strs, int i, int m, int n, int[][][] dp) {
        if (i == strs.length) {
            return 0;
        }
        if (dp[i][m][n] != -1) {
            return dp[i][m][n];
        }
        int res = 0;
        res = f2(strs, i + 1, m, n, dp);
        spendOneAndZero(strs[i]);
        if (m - zeros >= 0 && n - ones >= 0) {
            res = Math.max(res, f2(strs, i + 1, m - zeros, n - ones, dp) + 1);
        }
        dp[i][m][n] = res;
        return res;
    }

    int f1(String[] strs, int i, int m, int n) {
        if (i == strs.length) {
            return 0;
        }
        int res = 0;
        res = f1(strs, i + 1, m, n);
        spendOneAndZero(strs[i]);
        if (m - zeros >= 0 && n - ones >= 0) {
            res = Math.max(res, f1(strs, i + 1, m - zeros, n - ones) + 1);
        }
        return res;
    }
//
//
//
//    public static int zeros, ones;
//
//    public static void zerosAndOnes(String s) {
//        zeros = 0;
//        ones = 0;
//        for (int i = 0; i < s.length(); i++) {
//            if (s.charAt(i) == '0') {
//                zeros++;
//            } else {
//                ones++;
//            }
//        }
//    }
//
//    public static int findMaxForm1(String[] strs, int m, int n) {
//        int[][][] dp = new int[m+1][n+1][strs.length + 1];
//        for (int i = 0; i <= m; i++) {
//            for (int j = 0; j <= n; j++) {
//                for (int k = 0; k <= strs.length; k++) {
//                    dp[i][j][k] = Integer.MAX_VALUE;
//                }
//            }
//        }
//        return f2(strs, m, n, 0, dp);
//    }
//
//    public static int f2(String[] strs, int z, int o, int i, int[][][] dp) {
//        if (i == strs.length) {
//            return 0;
//        }
//
//        if (dp[z][o][i] != Integer.MAX_VALUE) {
//            return dp[z][o][i + 1];
//        }
//        int res1 = f2(strs, z, o, i+1, dp);
//        int res2 = 0;
//;        zerosAndOnes(strs[i]);
//        if (z - zeros >= 0 && o - ones >= 0) {
//            res2 = f2(strs, z - zeros, o - ones, i + 1, dp)+1;
//        }
//        dp[z][o][i] = Math.max(res1, res2);
//        return dp[z][o][i];
//    }
//
//    public static int f1(String[] strs, int z, int o, int i) {
//        if (i == strs.length) {
//            return 0;
//        }
//        int res1 = f1(strs, z, o, i + 1);
//        zerosAndOnes(strs[i]);
//        int res2 = 0;
//        if (z - zeros >= 0 && o - ones >= 0) {
//            res2 = f1(strs, z - zeros, o - ones, i + 1) + 1;
//        }
//        return Math.max(res1, res2);
//    }
}